#include <iostream>
#include <stdbool.h>
#include <assert.h>
#include <string.h>
using namespace std;
namespace wanghao
{
    class string
    {
    public:
        //迭代器
        using iterator = char*;
        using const_iterator = const char*;
        //无参构造
        //string();
        //带参构造
        string(const char* str = "");
        //拷贝构造
        string(const string& s);
        //赋值构造
        string& operator=(string s);
        //pos位置开始的len个构造
        string(const string& s,size_t pos,size_t len = npos);
        //计算字符串长度
        size_t strlen(const char* str);
        //析构函数
        ~string();
        //迭代器
        iterator begin();
        iterator end();
        //const迭代器
        const_iterator begin() const;
        const_iterator end() const;
        //size
        size_t size() const;
        //empty
        bool empty() const;
        //清空串
        void clean();
        //空间容量
        size_t capacity() const;
        //c_str
        iterator c_str() const;
        //开空间
        void reserve(size_t n);
        //尾插
        void push_back(char ch);
        //尾插一段字符串
        void append(const char* str);
        //尾删
        void pop_back();
        //指定位置插入字符
        void insert(size_t pos,char ch);
        //指定位置插入字符串
        void insert(size_t pos,const char* str);
        //删除pos位置开始的len个字符
        void erase(size_t pos,size_t len = npos);
        //[]
        char& operator[](size_t n);
        const char& operator[](size_t n) const;
        //取尾数据
        char& back();
        const char& back() const;
        //取头数据
        char& front();
        const char& front() const;
        //交换
        void swap(string& s);
        //+=一个字符
        string& operator+=(char ch);
        //+=一个字符串
        string& operator+=(const char* str);
        //取子串
        string substr(size_t pos,size_t len = npos);
        //从pos位置开始查找字符
        size_t find(char ch,size_t pos = 0);
        //从pos位置开始查找字符串
        size_t find(const char* str,size_t pos = 0);
    private:
        char* _str;
        size_t _size;
        size_t _capacity;
    public:
        static const size_t npos;
    };
    //流插入
    ostream& operator<<(ostream& out,const string& s);
    //流提取
    istream& operator>>(istream& in,string& s);
    //getline
    istream& getline(istream& in,string& s,char delim = '\n');
    //比较大小
    int strcmp(const char* str1,const char* str2);
    bool operator==(const string& lhs,const string& rhs);
    bool operator!=(const string& lhs,const string& rhs);
    bool operator>(const string& lhs,const string& rhs);
    bool operator<(const string& lhs,const string& rhs);
    bool operator>=(const string& lhs,const string& rhs);
    bool operator<=(const string& lhs,const string& rhs);
}